home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-11-04 | 10.7 KB | 448 lines |
- IMPLEMENTATION MODULE MyMathTrans;
- (*
- Created: 29.8.87 by
- Changed: 25.1.88/18.02.88/4.8.88/25.8.88/29.9.88
- Stefan Salewski
- Stolper Weg 3
- 2160 Stade West-Germany
- Tel: 04141/61130
-
- Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
-
- This Module may be freely copied. But please
- leave my name in. Thanks....Stefan
- *)
-
- FROM SYSTEM IMPORT FFP;
- FROM MyMathLibLong IMPORT errorNumber,unit,AngleUnit;
- FROM MathTrans IMPORT Acos,Asin,Atan,Cos,Cosh,Exp,Log,Log10,Pow,
- Sin,Sinh,Sqrt,Tan,Tanh,Fieee;
- CONST
- MaxFFP=MAX(FFP);
- TwoPi=6.2831853;
- DegToRad=TwoPi/360.0;
- GonToRad=TwoPi/400.0;
- RadToDeg=360.0/TwoPi;
- RadToGon=400.0/TwoPi;
- (****************************************************************************)
- PROCEDURE MyUnit(w:FFP):FFP;
- (* rechnet Winkel in Grad oder Neugrad in Radiant um, wenn unit # rad *)
- BEGIN
- IF unit=deg THEN
- RETURN w*DegToRad
- ELSIF unit=gon THEN
- RETURN w*GonToRad
- ELSE
- RETURN w
- END
- END MyUnit;
- (****************************************************************************)
- PROCEDURE YourUnit(w:FFP):FFP;
- (* Rechnet Resultate von rad in die durch unit bestimmte Einheit um *)
- BEGIN
- IF unit=deg THEN
- RETURN w*RadToDeg
- ELSIF unit=gon THEN
- RETURN w*RadToGon
- ELSE
- RETURN w
- END
- END YourUnit;
- (****************************************************************************)
- PROCEDURE NeutraleFunc(x:FFP):FFP;
- BEGIN
- (*errorNumber:=0;*)
- RETURN x
- END NeutraleFunc;
- (****************************************************************************)
- PROCEDURE Abs(x:FFP):FFP;
- BEGIN
- (*errorNumber:=0;*)
- RETURN ABS(x)
- END Abs;
- (****************************************************************************)
- PROCEDURE Fac(x:FFP):FFP;
- (* Facultaet fuer ganze Zahlen 0 <= n <= 19 *)
- VAR
- j:[0..20];
- intx:INTEGER;
- z:FFP;
- zuklein,zugross,istganz:BOOLEAN;
- BEGIN
- zugross:=x>19.0;
- zuklein:=x<0.0;
- IF (NOT zuklein) AND (NOT zugross) THEN
- intx:=INTEGER(x);
- istganz:=(x=FFP(intx));
- IF istganz THEN
- (*errorNumber:=0;*)
- z:=1.0;
- FOR j:=2 TO intx DO
- z:=z * FFP(j)
- END;
- RETURN z
- ELSE
- errorNumber:=77;
- RETURN 0.0
- END
- ELSIF zugross THEN
- errorNumber:=51;
- RETURN MaxFFP
- ELSE
- errorNumber:=76;
- RETURN 0.0
- END
- END Fac;
- (****************************************************************************)
- PROCEDURE Sqr(x:FFP):FFP;
- (* Quadrat *)
- BEGIN
- IF (x<= 1.0E9) THEN
- (*errorNumber:=0;*)
- RETURN x*x;
- ELSE
- errorNumber:=52;
- RETURN MaxFFP
- END
- END Sqr;
- (****************************************************************************)
- PROCEDURE Power(x,y:FFP):FFP;
- (*Raise x to the y th power x^y *)
- CONST
- Epsilon=1.0E-6;
- VAR inty:INTEGER;
- j:CARDINAL;
- z:FFP;
- expNegativ,ok:BOOLEAN;
- BEGIN
- (*errorNumber:=0;*)
- ok:=(ABS(y)<10.0) AND (x<=60.0);
- IF ok THEN
- IF y<0.0 THEN (* runden*)
- inty:=INTEGER(y-0.5)
- ELSE
- inty:=INTEGER(y+0.5)
- END;
- END;
- IF ok AND (ABS(y-FFP(inty))<Epsilon) THEN
- expNegativ:=(inty<0);
- inty:=ABS(inty);
- z:=x;
- x:=1.0;
- FOR j:=1 TO inty DO
- x:=x*z
- END;
- IF expNegativ THEN
- IF x=0.0 THEN
- errorNumber:=3
- ELSE
- x:=1.0/x;
- END
- END
- ELSIF y=0.0 THEN
- x:=1.0
- ELSE
- IF x>0.0 THEN
- x:=Exp(y*Log(x));
- ELSE
- x:=0.0;
- errorNumber:=4
- END
- END;
- RETURN x
- END Power;
- (****************************************************************************)
- PROCEDURE SIN(x:FFP):FFP;
- BEGIN
- x:=MyUnit(x);
- IF ABS(x) < 1.0E8 THEN
- (*errorNumber:=0;*)
- RETURN Sin(x)
- ELSE
- errorNumber:=18;
- RETURN 0.0
- END;
- END SIN;
- (****************************************************************************)
- PROCEDURE COS(x:FFP):FFP;
- BEGIN
- x:=MyUnit(x);
- IF ABS(x) < 1.0E8 THEN
- (*errorNumber:=0;*)
- RETURN Cos(x)
- ELSE
- errorNumber:=18;
- RETURN 0.0
- END
- END COS;
- (****************************************************************************)
- PROCEDURE TAN(x:FFP):FFP;
- BEGIN
- x:=MyUnit(x);
- IF ABS(x) < 1.0E8 THEN
- IF Cos(x)=0.0 THEN
- errorNumber:=5;
- RETURN MaxFFP
- ELSE
- (*errorNumber:=0;*)
- RETURN Tan(x)
- END
- ELSE
- errorNumber:=18;
- RETURN 0.0
- END
- END TAN;
- (****************************************************************************)
- PROCEDURE Arctan(x:FFP):FFP;
- BEGIN
- RETURN YourUnit(Atan(x))
- END Arctan;
- (****************************************************************************)
- PROCEDURE Cot(x:FFP):FFP;
- (* Kotangens *)
- VAR z:FFP;
- BEGIN
- x:=MyUnit(x);
- IF ABS(x) < 1.0E8 THEN
- z:=Cos(PiHalbe-x);
- IF z=0.0 THEN
- errorNumber:=6;
- RETURN MaxFFP
- ELSE
- (*errorNumber:=0;*)
- RETURN Sin(PiHalbe-x)/z
- END
- ELSE
- errorNumber:=18;
- RETURN 0.0
- END
- END Cot;
- (****************************************************************************)
- PROCEDURE Sec(x:FFP):FFP;
- (*Sekans = 1/cos(x) *)
- VAR y:FFP;
- BEGIN
- x:=MyUnit(x);
- IF ABS(x) < 1.0E8 THEN
- y:=Cos(x);
- IF y=0.0 THEN
- errorNumber:=7;
- RETURN MaxFFP
- ELSE
- (*errorNumber:=0;*)
- RETURN 1.0/y
- END
- ELSE
- errorNumber:=18;
- RETURN 0.0
- END
- END Sec;
- (****************************************************************************)
- PROCEDURE Cosec(x:FFP):FFP;
- (* Kosekans =1/sin(x) *)
- VAR y:FFP;
- BEGIN
- x:=MyUnit(x);
- IF ABS(x) < 1.0E8 THEN
- y:=Sin(x);
- IF y=0.0 THEN
- errorNumber:=8;
- RETURN MaxFFP
- ELSE
- (*errorNumber:=0;*)
- RETURN 1.0/Sin(x)
- END
- ELSE
- errorNumber:=18;
- RETURN 0.0
- END
- END Cosec;
- (****************************************************************************)
- PROCEDURE Arcsin(x:FFP):FFP;
- (* ArcusSinus= Umkehrfunktion des Sinus -1<= x <= +1 *)
- BEGIN
- IF ABS(x)<=1.0 THEN
- (*errorNumber:=0;*)
- RETURN YourUnit(Asin(x))
- ELSE
- errorNumber:=9;
- RETURN 0.0
- END
- END Arcsin;
- (****************************************************************************)
- PROCEDURE Arccos(x:FFP):FFP;
- (* ArcusCosinus = Umkehrfunktion des Cosinus -1 <=x <= +1 *)
- BEGIN
- IF ABS(x)<=1.0 THEN
- (*errorNumber:=0;*)
- RETURN YourUnit(Acos(x))
- ELSE
- errorNumber:=10;
- RETURN 0.0
- END
- END Arccos;
- (****************************************************************************)
- PROCEDURE Arccot(x:FFP):FFP;
- (* ArcusKotangens = Umkehrfunktion des Kotangens *)
- BEGIN
- (*errorNumber:=0;*)
- RETURN YourUnit(PiHalbe-Atan(x))
- END Arccot;
- (****************************************************************************)
- PROCEDURE EXP(x:FFP):FFP;
- BEGIN
- IF ABS(x)< 42.0 THEN
- (*errorNumber:=0;*)
- RETURN Exp(x)
- ELSE errorNumber:=11;
- RETURN 0.0
- END
- END EXP;
- (****************************************************************************)
- PROCEDURE Ln(x:FFP):FFP;
- (* Natuerlicher Logarithnus*)
- BEGIN
- IF x>0.0 THEN
- (*errorNumber:=0;*)
- RETURN Log(x)
- ELSE
- errorNumber:=12;
- RETURN 0.0
- END
- END Ln;
- (*****************************************************************************)
- PROCEDURE LOG(x:FFP):FFP;
- (*Logarithmus zur Basis 10*)
- BEGIN
- IF x>0.0 THEN
- (*errorNumber:=0;*)
- RETURN Log10(x)
- ELSE errorNumber:=13;
- RETURN 0.0
- END
- END LOG;
- (****************************************************************************)
- PROCEDURE SINH(x:FFP):FFP;
- (* Sinus Hyperbolicus bzw. HyperbelSinus *)
- BEGIN
- IF x>42.0 THEN
- errorNumber:=54;
- RETURN MaxFFP
- ELSIF x<-42.0 THEN
- errorNumber:=54;
- RETURN -MaxFFP
- ELSE
- (*errorNumber:=0;*)
- RETURN Sinh(x)
- END
- END SINH;
- (****************************************************************************)
- PROCEDURE COSH(x:FFP):FFP;
- (* Cosinus Hyperbolicus bzw. HyperbelCosinus *)
- BEGIN
- IF ABS(x)>42.0 THEN
- errorNumber:=54;
- RETURN MaxFFP
- ELSE
- (*errorNumber:=0;*)
- RETURN Cosh(x)
- END
- END COSH;
- (****************************************************************************)
- PROCEDURE TANH(x:FFP):FFP;
- (* Tangens Hyperbolicus bzw. HyperbelTangens *)
- BEGIN
- (*errorNumber:=0;*)
- RETURN Tanh(x)
- END TANH;
- (****************************************************************************)
- PROCEDURE Coth(x:FFP):FFP;
- (* Cotanges Hyperbolicus bzw. HyperbelCotangens *)
- VAR y,y1:FFP;
- BEGIN
- IF x#0.0 THEN
- (*errorNumber:=0;*)
- y:=Exp(x);
- y1:=1.0/y;
- RETURN (y+y1)/(y-y1)
- ELSE
- errorNumber:=14;
- RETURN 0.0
- END
- END Coth;
- (****************************************************************************)
- PROCEDURE Arsinh(x:FFP):FFP;
- (* AreaSinus = Umkehrfunktion von sinh(x) *)
- VAR y:FFP;
- BEGIN
- (*errorNumber:=0;*)
- y:=Log(x+Sqrt(x*x+1.0));
- RETURN y
- END Arsinh;
- (****************************************************************************)
- PROCEDURE Arcosh(x:FFP):FFP;
- (* AreaCosinus = Umkehrfunktion von cosh(x) *)
- VAR y:FFP;
- BEGIN
- IF x>=1.0 THEN
- (*errorNumber:=0;*)
- y:=Log(x+Sqrt(x*x-1.0));
- RETURN y
- ELSE
- errorNumber:=15;
- RETURN 0.0
- END
- END Arcosh;
- (****************************************************************************)
- PROCEDURE Artanh(x:FFP):FFP;
- (* AreaTangens = Umkehrfunktion tanh(x) *)
- VAR y:FFP;
- BEGIN
- IF ABS(x)<1.0 THEN
- (*errorNumber:=0;*)
- y:=0.5*Ln((1.0+x)/(1.0-x));
- RETURN y
- ELSE
- errorNumber:=16;
- RETURN 0.0
- END
- END Artanh;
- (****************************************************************************)
- PROCEDURE SQRT(x:FFP):FFP;
- BEGIN
- IF x>=0.0 THEN
- (*errorNumber:=0;*)
- RETURN Sqrt(x)
- ELSE
- errorNumber:=17;
- RETURN 0.0
- END
- END SQRT;
- (****************************************************************************)
- PROCEDURE Arcoth(x:FFP):FFP;
- BEGIN
- IF ABS(x)>1.0 THEN
- (*errorNumber:=0;*)
- RETURN 0.5*Log((x+1.0)/(x-1.0))
- ELSE
- errorNumber:=19;
- RETURN 0.0
- END
- END Arcoth;
- (****************************************************************************)
- PROCEDURE Int(x:FFP):FFP;
- BEGIN
- IF ABS(x)<2147483648.0 THEN
- (*errorNumber:=0;*)
- RETURN FFP(LONGINT(x))
- ELSE
- errorNumber:=20;
- RETURN 0.0
- END
- END Int;
- BEGIN
- unit:=rad;
- errorNumber:=0
- END MyMathTrans.mod
-
-